package com.mucd.chat.service.socketService;

import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import com.mucd.chat.service.MessageListService;
import com.mucd.chat.utils.SessionContainer;
import com.ruoyi.common.constant.CacheConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.redis.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import javax.websocket.Session;
import java.util.Collections;
import java.util.List;

/**
 * 消息列表socket service
 */
@Slf4j
@Service
public class MessageListSocketService {

    @Resource
    private MessageListService messageListService;

    @Resource
    private RedisCache redisCache;

    /**
     * 查询用户消息列表
     *
     * @param session   登录人的session
     * @param loginUser 登录人
     */
    public void selectMessageListByUserId(Session session, LoginUser loginUser) {

        log.info("查询用户消息列表: " + loginUser.getUsername());

    }

    /**
     * 消息列表socket
     * 发送消息后会根据这里面的key去给好友列表推送消息
     *
     * @param session      登录用户session
     * @param loginUser    登录用户信息
     * @param onlineStatus true上线 false离线
     */
    public void settingMessageListOnline(Session session, LoginUser loginUser, Boolean onlineStatus) {
        if (onlineStatus) {
            SessionContainer.put(CacheConstants.MSGLIST_ONLINE_ON_KEY + loginUser.getUserId(), session);
        } else {
            SessionContainer.deleteByKey(CacheConstants.MSGLIST_ONLINE_ON_KEY + loginUser.getUserId());
        }
    }

    /**
     * 查询指定好友的在线状态
     *
     * @param loginUser 好友信息
     * @return true 在线 false 离线
     */
    public Boolean selectMessageListOnlineStatus(LoginUser loginUser) {
        Session onlineSession = SessionContainer.get(CacheConstants.MSGLIST_ONLINE_ON_KEY + loginUser.getUserId());
        return onlineSession != null && onlineSession.isOpen();
    }

    /**
     * todo 先不做实时刷新消息列表
     * 推送消息列表
     * 把消息存入缓存中,等到好友上线或者在线时,会从缓存中取出消息,发送给好友
     *
     * @param message      消息内容
     * @param friendId     好友id
     * @param onlineStatus true 在线线 false 离线
     */
    public void sendMessageListCache(String message, Long friendId, Boolean onlineStatus) {
        //如果在线直接推送,如果离线则保存

        //消息列表session
        Session session = SessionContainer.get(CacheConstants.MSGLIST_ONLINE_ON_KEY + friendId);
        //首页列表在线
        if (session != null && session.isOpen()) {
            session.getAsyncRemote().sendText(JSONObject.toJSONString(R.ok(message)));
        } else {
            List<String> cacheList = redisCache.getCacheList(CacheConstants.MSGLIST_CONTENT_KEY + friendId);

            List<String> cacheMsgList = ObjectUtil.isNull(cacheList) ? Collections.emptyList() : cacheList;
            cacheMsgList.add(message);

            redisCache.setCacheList(CacheConstants.MSGLIST_CONTENT_KEY + friendId, cacheMsgList);
        }
    }
}
